import matplotlib.pyplot as plt
import numpy as np

#支持中文
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
# 支持负数
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 创建图表和坐标轴
fig, ax = plt.subplots(figsize=(12, 8))
plt.title('Zorder 效果演示', fontsize=16, pad=20)

# 1. 默认顺序（左侧）
ax.text(0.05, 0.95, '默认顺序', transform=ax.transAxes, fontsize=14, 
        bbox=dict(facecolor='white', alpha=0.8))

# 背景矩形（Patch）
rect1 = plt.Rectangle((1, -1), 3, 2, color='skyblue', alpha=0.7)
ax.add_patch(rect1)

# 线条（Line）
line1, = ax.plot(x, y, 'r-', linewidth=4, label='正弦波')

# 文本（Text）
text1 = ax.text(2.5, 0, '默认文本', color='black', fontsize=12, 
               ha='center', va='center', weight='bold')
# 图例（Legend）
ax.legend(loc='upper left')

# 2. 调整顺序（右侧）
ax.text(0.55, 0.95, '调整顺序', transform=ax.transAxes, fontsize=14, 
        bbox=dict(facecolor='white', alpha=0.8))

# 背景矩形（Patch） - 提高zorder
rect2 = plt.Rectangle((6, -1), 3, 2, color='lightgreen', alpha=0.7, zorder=3)
ax.add_patch(rect2)

# 线条（Line） - 降低zorder
line2, = ax.plot(x+5, y, 'purple', linewidth=4, label='调整的正弦波', zorder=1)

# 文本（Text） - 降低zorder
text2 = ax.text(7.5, 0, '被覆盖的文本', color='black', fontsize=12, 
               ha='center', va='center', weight='bold', zorder=2)

# 添加额外文本展示在矩形上方
text3 = ax.text(7.5, 0.8, '在矩形上的文本', color='darkred', fontsize=12, 
               ha='center', va='center', weight='bold', zorder=4)
text3.set_zorder(4)               

# 图例（Legend） - 保持最高
ax.legend(loc='upper right')

# 添加说明文本
explanation = """左侧：默认顺序
  - 蓝色矩形 (zorder=1) 在底部
  - 红色线条 (zorder=2) 在矩形之上
  - 黑色文本 (zorder=3) 在线条之上
  - 图例 (zorder=4) 在最顶部

右侧：调整顺序
  - 绿色矩形 (zorder=3) 覆盖了文本
  - 紫色线条 (zorder=1) 在矩形之下
  - 黑色文本 (zorder=2) 被矩形覆盖
  - 红色文本 (zorder=4) 在矩形之上
  - 图例 (zorder=4) 保持最顶部"""
ax.text(0.5, -1.8, explanation, ha='center', fontsize=12, transform=ax.transAxes)

# 设置坐标轴范围
ax.set_xlim(0, 10)
ax.set_ylim(-1.5, 1.5)
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')

plt.tight_layout()
plt.show()